import { menuConfig, rNames } from "@/config/menuConfig.ts";
import { isEqual, isObject, isUndefined } from "lodash";
import router from "@/router";
import { getImgsTempUrl } from "./cloud";
import { getImgsTempUrlType } from "CustomTypes";

/**
 * 获取路由的信息
 * @param keyPath 路由的名字
 */
export const getRouteInfo = (keyPath: Array<string> = []) => {
  const lv1Index: number = Number.parseInt(keyPath[0]);
  const rowResult = menuConfig[lv1Index];
  // 一级路由
  if (rowResult.children === undefined) {
    const { name, title } = rowResult;
    return { name, title };
  }
  // 二级路由
  const tempNum = keyPath[1].split("-").pop();
  if (undefined === tempNum) return false;
  const lv2Index: number = Number.parseInt(tempNum);
  if (lv2Index !== undefined) {
    const { name, title } = rowResult.children[lv2Index];
    return { name, title };
  }
};
/**
 * 判断环境，是否是 development。
 */
export const isDevelopment = () => process.env.NODE_ENV === "development";
/**
 * 判断环境，是否是 production。
 */
export const isProduction = () => process.env.NODE_ENV === "production";
/**
 * 需要加密
 */
export const needAuth = () => process.env.VUE_APP_AUTH_FLAG === "true";
/**
 * to路由
 * @param name 跳转到的路由名字。
 * @param params 传递的参数。
 * @param flag 是否加密参数，默认值是true。
 */
export const toRoute = (name: rNames, params = {}, flag = true) => {
  if (isUndefined(params)) {
    router.push({ name });
    return;
  }
  const str = isObject(params) ? JSON.stringify(params) : params;
  const data = flag ? window.encodeURIComponent(str) : str;
  router.push({
    name,
    params: { data }
  });
};
/**
 * 获取加密之后的路由数据
 * @param data 被加密的路由数据
 */
export const getRouteParams = <T>(data: string): T => {
  const decodeStr = window.decodeURIComponent(data);
  const result = JSON.parse(decodeStr);
  return result as T;
};
/**
 * 云存储地址示例：
 * "<p>无</p>
 * <div class="media-wrap image-wrap">
 * <img src="cloud://cake-shop-001-gppbo.6361-cake-shop-001-gppbo-1258172236/uploads/1594006678588_timg.jpg"/>
 * </div><p></p>"
 *
 * 获取云服务器中的地址，有可能是临时下载地址或者实际下载地址
 * @param {*} text 这里是包含img的存储地址，或者是临时下载地址的html标签
 */
export const getStorageImgUrls = (text: string) =>
  text.match(/cloud:[^<]+.jpg/g);
/**
 * 获取临时下载地址，返回字符串
 * 'https://6361-cake-shop-001-gppbo-1258172236.tcb.qcloud.la/uploads/1593681350162_timg.jpg'
 * @param {*} text 这里是包含img的临时存储地址，或者是临时下载地址的html标签
 */
export const getCloudTempImgUrls = (text: string) =>
  text.match(/https:[^<]+.jpg/g);
/**
 * 获取ckeditor5富文本中的 使用 srcset 标签的图片url，用于替换成传统的url
 * 从返回的结果中，使用方法 getCloudTempImgUrls，提取传统的url
 * @param {*} text 图片的临时下载地址
 */
export const getCKEditor5CloudTempImgUrls = (text: string) =>
  text.match(/srcset[^<]+"/g);
/**
 * 将html标签中的云存储地址换成临时下载的地址
 * @param {*} textWithHtml 这是一段html标签，其中有服务器的下载用地址
 */
export const translateTextWithHtml = async (textWithHtml: string) => {
  if (isUndefined(textWithHtml) || isEqual("", textWithHtml)) return "";
  let newDetail = textWithHtml;
  /**
   * 从html标签中获取图片的云存储地址，imgs是数组。
   */
  const imgs = getStorageImgUrls(textWithHtml);
  // 表示没有云存储地址，都是临时下载地址。那么就直接返回 newDetail
  if (null === imgs) return newDetail;
  // 获取临时下载地址
  const { fileList } = await getImgsTempUrl(imgs);
  // 将html标签中的图片下载用url，替换为临时下载用url。
  imgs.forEach((img: any, index: any) => {
    newDetail = newDetail.replace(img, fileList[index].url);
  });

  return newDetail;
};
